#ifndef _FM17XXX_API_H_
#define _FM17XXX_API_H_

#include <stdint.h>
#include <string.h>
#include <stdbool.h>
#include "rfid_board.h"

#if _RFID_FUNCTION_ENABLE_
#define MAXRLEN                                      (64)

#define MI_OK                                        (0)
#define MI_ERR                                       (2)
#define MI_NOTAGERR                                  (2)
#define MI_CHK_FAILED                                (2)
#define MI_CRCERR                                    (2)
#define MI_CHK_COMPERR                               (2)
#define MI_EMPTY                                     (3)
#define MI_AUTHERR                                   (4)
#define MI_PARITYERR                                 (5)
#define MI_CODEERR                                   (6)
#define MI_SERNRERR                                  (8)
#define MI_KEYERR                                    (9)
#define MI_NOTAUTHERR                                (10)
#define MI_BITCOUNTERR                               (11)
#define MI_BYTECOUNTERR                              (12)
#define MI_IDLE                                      (13)
#define MI_TRANSERR                                  (14)
#define MI_WRITEERR                                  (15)
#define MI_INCRERR                                   (16)
#define MI_DECRERR                                   (17)
#define MI_READERR                                   (18)
#define MI_OVFLERR                                   (19)
#define MI_POLLING                                   (20)
#define MI_FRAMINGERR                                (21)
#define MI_ACCESSERR                                 (22)
#define MI_UNKNOWN_COMMAND                           (23)
#define MI_COLLERR                                   (24)
#define MI_RESETERR                                  (25)
#define MI_INITERR                                   (25)
#define MI_INTERFACEERR                              (26)
#define MI_ACCESSTIMEOUT                             (27)
#define MI_NOBITWISEANTICOLL                         (28)
#define MI_QUIT                                      (30)
#define MI_INTEGRITY_ERR                             (35)
#define MI_RECBUF_OVERFLOW                           (50)
#define MI_SENDBYTENR                                (51)
#define MI_SENDBUF_OVERFLOW                          (53)
#define MI_BAUDRATE_NOT_SUPPORTED                    (54)
#define MI_SAME_BAUDRATE_REQUIRED                    (55)
#define MI_WRONG_PARAMETER_VALUE                     (60)
#define MI_BREAK                                     (99)
#define MI_NY_IMPLEMENTED                            (100)
#define MI_NO_MFRC                                   (101)
#define MI_MFRC_NOTAUTH                              (102)
#define MI_WRONG_DES_MODE                            (103)
#define MI_HOST_AUTH_FAILED                          (104)
#define MI_WRONG_LOAD_MODE                           (106)
#define MI_WRONG_DESKEY                              (107)
#define MI_MKLOAD_FAILED                             (108)
#define MI_FIFOERR                                   (109)
#define MI_WRONG_ADDR                                (110)
#define MI_DESKEYLOAD_FAILED                         (111)
#define MI_WRONG_SEL_CNT                             (114)
#define MI_WRONG_TEST_MODE                           (117)
#define MI_TEST_FAILED                               (118)
#define MI_TOC_ERROR                                 (119)
#define MI_COMM_ABORT                                (120)
#define MI_INVALID_BASE                              (121)
#define MI_MFRC_RESET                                (122)
#define MI_WRONG_VALUE                               (123)
#define MI_VALERR                                    (124)
#define MI_COM_ERR                                   (125)
#define PROTOCOL_ERR                                 (126)

#define PCD_IDLE                                     0x00 // 无动作，取消当前指令执行
#define PCD_MEM                                      0x01 // 配置FM17xxx为FeliCa、MIFARE和NFCIP-1通讯模式
#define PCD_RANDID                                   0x02 // 产生一个10字节随机数
#define PCD_CALCCRC                                  0x03 // 激活CRC协处理器
#define PCD_TRANSMIT                                 0x04 // 发射FIFO缓冲器中的数据
#define PCD_NO_CMD_CHANGE                            0x07 // 指令不改变，可以用来在不影响指令的情况下修改CommandReg寄存器，比如PowerDown位
#define PCD_RECEIVE                                  0x08 // 激活接收器电路
#define PCD_TRANSCEIVE                               0x0C // 发射FIFO缓冲器中的数据到天线，并在发射后自动激活接收器
#define PCD_AUTHENT                                  0x0E // 作为读写器模式执行MIFARE标准安全认证 密钥验证
#define PCD_RESETPHASE                               0x0F // 复位FM17xxx
#define PCD_SLEEP                                    0x10 // 进入休眠模式

//============== MF RC522寄存器定义 ===============================================================
// 页零；命令和状态寄存器
#define JREG_RFU00                                   0x00 // 保留
#define JREG_COMMAND                                 0x01 // 命令寄存器
#define JREG_COMMIEN                                 0x02 // 中断使能寄存器 IRQ、TX、RX、IDLE、HI、LO、ERR、TIMER
#define JREG_DIVIEN                                  0x03 // 中断使能寄存器 IRQ、SIGIN、MODE、CRC、RFON、RFOFF
#define JREG_COMMIRQ                                 0x04 // 中断标志
#define JREG_DIVIRQ                                  0x05 // 中断标志
#define JREG_ERROR                                   0x06 // 错误状态寄存器
#define JREG_STATUS1                                 0x07 // 状态寄存器1
#define JREG_STATUS2                                 0x08 // 状态寄存器2
#define JREG_FIFODATA                                0x09 // FIFO
#define JREG_FIFOLEVEL                               0x0A // FIFO存储字节数寄存器
#define JREG_WATERLEVEL                              0x0B // FIFO上溢、下溢报警深度
#define JREG_CONTROL                                 0x0C // 控制寄存器（定时器控制，接收的位）
#define JREG_BITFRAMING                              0x0D // Bit帧控制寄存器
#define JREG_COLL                                    0x0E // 冲突位寄存器
#define JREG_RFU0F                                   0x0F // 保留

// 页一；通信寄存器
#define JREG_RFU10                                   0x10 // 保留
#define JREG_MODE                                    0x11 // 通信模式寄存器
#define JREG_TXMODE                                  0x12 // 发送控制寄存器（CRC和速率控制）
#define JREG_RXMODE                                  0x13 // 接收控制寄存器（CRC和速率控制）
#define JREG_TXCONTROL                               0x14 // TX输出控制寄存器
#define JREG_TXASK                                   0x15 // 发送器ASK调制系数控制寄存器
#define JREG_TXSEL                                   0x16 // 发送控制寄存器（信号输入/输出选择）
#define JREG_RXSEL                                   0x17 // 接收控制寄存器（信号输入选择）
#define JREG_RXTHRESHOLD                             0x18 // 接收控制寄存器（译码器阈值设置）
#define JREG_DEMOD                                   0x19 // 接收控制寄存器（解调器设置）
#define JREG_FELNFC1                                 0x1A // 定义 FelCa 同步字节
#define JREG_FELNFC2                                 0x1B // 定义接收的最大包（FelCa）
#define JREG_MIFNFC                                  0x1C // 定义ISO14443A/Mifare/NFC的工作模式
#define JREG_MANUALRCV                               0x1D // 接收器微调寄存器
#define JREG_TYPEB                                   0x1E // TypeB
#define JREG_SERIALSPEED                             0x1F // 串行UART速率控制寄存器
// 页二；配置寄存器
#define JREG_RFU20                                   0x20 // 保留
#define JREG_CRCRESULT1                              0x21 // CRC计算结果寄存器（MSB）
#define JREG_CRCRESULT2                              0x22 // CRC计算结果寄存器（LSB）
#define JREG_GSNOFF                                  0x23 // 保留
#define JREG_MODWIDTH                                0x24 // 调制宽度控制寄存器
#define JREG_TXBITPHASE                              0x25 // 保留
#define JREG_RFCFG                                   0x26 // 接收器增益控制寄存器
#define JREG_GSN                                     0x27 // 天线驱动输出脚电导控制寄存器（N,控制功率）
#define JREG_CWGSP                                   0x28 // 天线驱动输出脚电导控制寄存器（P,控制功率）
#define JREG_MODGSP                                  0x29 // 天线驱动输出脚电导控制寄存器（调节调制系数）
#define JREG_TMODE                                   0x2A // 定时器设置寄存器
#define JREG_TPRESCALER                              0x2B // 定时器分频系数寄存器
#define JREG_TRELOADHI                               0x2C // 16位定时器重装值（Hi）
#define JREG_TRELOADLO                               0x2D // 16位定时器重装值（Lo）
#define JREG_TCOUNTERVALHI                           0x2E // 16位定时器当值（Hi）
#define JREG_TCOUNTERVALLO                           0x2F // 16位定时器当值（Lo）
// 页三；测试寄存器
#define JREG_RFU30                                   0x30 // 保留
#define JREG_TESTSEL1                                0x31 // 测试寄存器
#define JREG_TESTSEL2                                0x32 // 测试寄存器
#define JREG_TESTPINEN                               0x33 // 测试寄存器
#define JREG_TESTPINVALUE                            0x34 // 测试寄存器
#define JREG_TESTBUS                                 0x35 // 内部测试总线状态
#define JREG_AUTOTEST                                0x36 // 自测试控制寄存器
#define JREG_VERSION                                 0x37 // 版本
#define JREG_ANALOGTEST                              0x38 // AUX管脚控制寄存器
#define JREG_TESTDAC1                                0x39 // DAC1测试值
#define JREG_TESTDAC2                                0x3A // DAC1测试值
#define JREG_TESTADC                                 0x3B // ADC_I和ADC_Q的值
#define JREG_ANALOGUETEST1                           0x3C // 测试寄存器
#define JREG_RFT3D                                   0x3D // 测试寄存器
#define JREG_RFT3E                                   0x3E // 测试寄存器
#define JREG_RFT3F                                   0x3F // 测试寄存器

//============== PN512 命令码定义 ===============================================================
#define JCMD_IDLE                                    0x00 | 0x20 // 空闲命令
#define JCMD_CONFIG                                  0x01 // 配置命令（PN512）
#define JCMD_MEM                                     0x01 // 存储25字节到内部缓冲区（RC52x）
#define JCMD_GENRANID                                0x02 // 获取10字节的随机数
#define JCMD_CALCCRC                                 0x03 // 计算CRC
#define JCMD_TRANSMIT                                0x04 // 发送数据 
#define JCMD_NOCMDCHANGE                             0x07 // 修改命令寄存器的其他位（不改变当前命令）
#define JCMD_RECEIVE                                 0x08 // 激活接收器
#define JCMD_TRANSCEIVE                              0x0C // 发送FIFO中的数据到天线，传输后激活接收电路
#define JCMD_AUTOCOLL                                0x0D
#define JCMD_AUTHENT                                 0x0E // MIFARE认证
#define JCMD_SOFTRESET                               0x0F // 软件复位

//============= 位定义 ============================================================================
// #define JREG_COMMAND                              0x01 // 命令寄存器           	
#define JBIT_RCVOFF                                  0x20 // 模拟部分开/关控制位
#define JBIT_POWERDOWN                               0x10 // PN511电源控制(软件掉电)

// #define JREG_COMMIEN                              0x02 // 中断使能寄存器       
#define JBIT_IRQINV                                  0x80 // 设置中断脚输出模式

// #define JREG_DIVIEN                               0x03 // 中断使能寄存器       
#define JBIT_IRQPUSHPULL                             0x80 // 设置中断脚输出模式

// JREG_COMMIEN/JREG_COMMIRQ                         0x02, 0x04 // 中断使能/请求        
#define JBIT_TXI                                     0x40 // 发送中断使能/请求
#define JBIT_RXI                                     0x20 // 接收中断使能/请求
#define JBIT_IDLEI                                   0x10 // 空闲中断使能/请求
#define JBIT_HIALERTI                                0x08 // FIFO高中断使能/请求
#define JBIT_LOALERTI                                0x04 // FIFO低中断使能/请求
#define JBIT_ERRI                                    0x02 // 错误中断使能/请求
#define JBIT_TIMERI                                  0x01 // 定时器中断使能/请求

// JREG_DIVIEN/JREG_DIVIRQ                           0x03, 0x05 // 中断使能/请求        
#define JBIT_SIGINACTI                               0x10 // Sigin信号中断使能/请求
#define JBIT_MODE                                    0x08 // 模式中断使能/请求（PN512）
#define JBIT_CRCI                                    0x04 // CRC中断使能/请求
#define JBIT_RFON                                    0x02 // RFON中断使能/请求（PN512）
#define JBIT_RFOFF                                   0x01 // RFOFF中断使能/请求（PN512）

// JREG_COMMIRQ/JREG_DIVIRQ                          0x04, 0x05 // 中断设置             
#define JBIT_SET                                     0x80 // 设置清除中断标志位

// Error Register                                    0x06 // 错误寄存器
#define JBIT_WRERR                                   0x80 // 写FIFO冲突错误
#define JBIT_TEMPERR                                 0x40 // 芯片温度过热
#define JBIT_BUFFEROVFL                              0x10 // FIFO溢出错误
#define JBIT_COLLERR                                 0x08 // 冲突位错误
#define JBIT_CRCERR                                  0x04 // CRC校验错误
#define JBIT_PARITYERR                               0x02 // 奇偶校验错误
#define JBIT_PROTERR                                 0x01 // 协议错误

// JREG_STATUS1                                      0x07 // 状态寄存器1      		
#define JBIT_RFFREQOK                                0x80 // 指示RF的频率，若外部RF场的频率在12MHz~15MHz,

#define JBIT_CRCOK                                   0x40 // CRC计算结果指示，若CRC计算为0，该位置位
#define JBIT_CRCREADY                                0x20 // CRC计算完毕，该位置位
#define JBIT_IRQ                                     0x10 // 中断请求，有任意中断，该位置1
#define JBIT_TRUNNUNG                                0x08 //
#define JBIT_EXRFON                                  0x04 // 外部RF场状态寄存器        
#define JBIT_HIALERT                                 0x02 // FIFO高
#define JBIT_LOALERT                                 0x01 // FIFO低

// Status 2 Register                                 0x08
#define JBIT_TEMPSENSOFF                             0x80 // 温度传感器开关
#define JBIT_I2CFORCEHS                              0x40 // IIC高速模式
#define JBIT_TARGETACTIVATED                         0x10
#define JBIT_CRYPTO1ON                               0x08 // Crypto 加密模式

// FIFOLevel Register                                0X0A
#define JBIT_FLUSHBUFFER                             0x80 // 1 清空FIFO

// ControlReg                                        0x0C // 包含不同的控制位
#define JBIT_TSTOPNOW                                0x80 // 1 定时器立即停止
#define JBIT_TSTARTNOW                               0x40 // 1 定时器立即启动
#define JBIT_WRNFCIDTOFIFO                           0x20 // 1 产生10字节NFCID
#define JBIT_INITIATOR                               0X10 // 1 卡模式

// BitFramiReg                                       0x0D // 面向位帧
#define JBIT_STARTSEND                               0x80 // 1 启动数据发送

// CollReg                                           0x0E // RF接口检测到的冲突位
#define JBIT_VALUESAFTERCOLL                         0x80 // 0 冲突位后的所接收的数据将被清除

// Page1
// ModeReg                                           0x11 // 定义发送和接收模式（包括CRC初值定义）
#define JBIT_MSBFIRST                                0x80 // CRC高位在前 RC523 
#define JBIT_TXWAITRF                                0x20
#define JBIT_POLSIGIN                                0x08 // SIGIN 极性

// TxModeReg                                         0x12 // 定义发送器波特率和模式
#define JBIT_INVMOD                                  0x08 // 1 发送数据调制反向

// RxModeReg                                         0x13 // 定义接收器波特率和模式
#define JBIT_RXNOERR                                 0x08 // 1 接收的位少于4位，将被忽略

// 定义 TxModeReg和RxModeReg共有的
#define JBIT_106KBPS                                 0x00
#define JBIT_212KBPS                                 0x10
#define JBIT_424KBPS                                 0x20
#define JBIT_848KBPS                                 0x30 // RC523

#define JBIT_CRCEN                                   0x80 // CRC使能
#define JBIT_ISO14443A                               0x00 // 数据传输模式TypeA	RC523
#define JBIT_ISO14443B                               0x03 // 数据传输模式TypeB	RC523

// TxControlReg                                      0x14 // 天线驱动脚控制逻辑
#define JBIT_INVTX2ON                                0x80 // 1 若TX2使能，则TX2信号输出反向
#define JBIT_INVTX1ON                                0x40 // 1 若TX1使能，则TX1信号输出反向
#define JBIT_INVTX2OFF                               0x20 // 1 若TX2禁止，则TX2信号输出反向  
#define JBIT_INVTX1OFF                               0x10 // 1 若TX1禁止，则TX1信号输出反向 
#define JBIT_TX2CW                                   0x08 // 1 TX2传输未调制的载波信号；
#define JBIT_TX2RFEN                                 0x02 // 1 TX2传输调制的载波信号
#define JBIT_TX1RFEN                                 0x01 // 1 TX1传输调制的载波信号

// JREG_TXAUTO                                       0x15 // 控制和设置天线驱动器 		
#define JBIT_AUTORFOFF                               0x80 // RF场自动关闭模式(NFCIP-1模式)
#define JBIT_FORCE100ASK                             0x40 // 100%ASK调制模式设置(独立于ModGsPReg)
#define JBIT_AUTOWAKEUP                              0x20 // 软件掉电模式下自动唤醒
#define JBIT_CAON                                    0x08 // 
#define JBIT_INITIALRFON                             0x04 // 
#define JBIT_TX2RFAUTOEN                             0x02 // TX2在外部RF场关闭后自动打开
#define JBIT_TX1RFAUTOEN                             0x01 // TX1在外部RF场关闭后自动打开

// DemodReg                                          0x19 // 解调器设置
#define JBIT_FIXIQ                                   0x20 // 解调器通道选择

// TModeReg                                          0x2A // 定时器模式设置
#define JBIT_TAUTO                                   0x80 // 1 定时器自动启动和停止
#define JBIT_TAUTORESTART                            0x10 // 1 定时器重新计数；8

//============= 位屏蔽码 ========================================================================
// Command register                                  0x01
#define JMASK_COMMAND                                0x0F // JREG_COMMAND 命令屏蔽码

// Waterlevel register                               0x0B
#define JMASK_WATERLEVEL                             0x3F // JREG_WATERLEVEL FIFO水平线屏蔽码

// Control register                                  0x0C
#define JMASK_RXBITS                                 0x07 // JREG_CONTROL 最后接收到的字节的有效位的数目屏蔽吗

// Mode register                                     0x11
#define JMASK_CRCPRESET                              0x03 // JREG_MODE CRC预置值的选择屏蔽码

// TxMode register                                   0x12, 0x13
#define JMASK_SPEED                                  0x70 // JREG_RXMODE 发送/接收数据位数率屏蔽码

// TxSel register                                    0x16
#define JMASK_DRIVERSEL                              0x30 // JREG_TXSEL TX1、TX2输出选择屏蔽码
#define JMASK_SIGOUTSEL                              0x0F // JREG_TXSEL MFOUT信号源选择屏蔽码

// RxSel register                                    0x17
#define JMASK_UARTSEL                                0xC0 // JREG_RXSEL 非接触式UART输入信号选择屏蔽码
#define JMASK_RXWAIT                                 0x3F // JREG_RXSEL 接收等待时间设置屏蔽码

// RxThreshold register                              0x18
#define JMASK_MINLEVEL                               0xF0 // JREG_RXTHRESHOLD 定义接收译码器输入的最小信号强度
#define JMASK_COLLEVEL                               0x07 // JREG_RXTHRESHOLD 定义冲突位信号的强度屏蔽码

// Demod register                                    0x19
#define JMASK_ADDIQ                                  0xC0 // JREG_DEMOD 接收过程中I/Q通道的选择屏蔽码
#define JMASK_TAURCV                                 0x0C // JREG_DEMOD 接收过程中内部PLL的时间常数屏蔽码
#define JMASK_TAUSYNC                                0x03 // JREG_DEMOD 突发过程中，内部PLL的时间常数屏蔽码

// RFCfg register                                    0x26
#define JMASK_RXGAIN                                 0x70 // JREG_RFCFG 接收信号电压增益因子屏蔽码

// GsN register                                      0x27
#define JMASK_CWGSN                                  0xF0 // JREG_GSN N驱动器的电导屏蔽码
#define JMASK_MODGSN                                 0x0F // JREG_GSN N驱动器的调制系数屏蔽码

// CWGsP register                                    0x28
#define JMASK_CWGSP                                  0x3F // JREG_CWGSP P驱动器的电导屏蔽码

// ModGsP register                                   0x29
#define JMASK_MODGSP                                 0x3F // JREG_MODGSP P驱动器的调制系数屏蔽码

// TMode register                                    0x2A
#define JMASK_TGATED                                 0x60 // JREG_TMODE 定时器门工作模式屏蔽码
#define JMASK_TPRESCALER_HI                          0x0F // JREG_TMODE 定时器高字节屏蔽码

//============================================================================
#define JREG_EXT_REG_ENTRANCE		                  0x0F //ext register entrance
//============================================================================
#define JBIT_EXT_REG_WR_ADDR		                  0x40 //wrire address cycle
#define JBIT_EXT_REG_RD_ADDR		                  0x80 //read address cycle
#define JBIT_EXT_REG_WR_DATA		                  0xC0 //write data cycle
#define JBIT_EXT_REG_RD_DATA		                  0x00 //read data cycle

//============================================================================
#define JREG_LPCDDELTA_HI                             0x26
//============================================================================

//============================================================================
#define JREG_LPCDDELTA_LO                             0x27
//============================================================================

//============================================================================
#define JREG_LPCDAUX                                  0x30
//============================================================================
#define IBN2U                                         0x00
#define TEST_BG                                       0x01
#define TEST_SAMPLE_I                                 0x02
#define TEST_AMP_OUT_IN                               0x03
#define TEST_AMP_OUT_IP                               0x04
#define TEST_AMP_OUT_QN                               0x05
#define TEST_AMP_OUT_QP                               0x06
#define OSC_64K                                       0x07
#define VBN2                                          0x08
#define VBN1                                          0x09
#define TEST_BG_VREF                                  0x0A
#define AVSS                                          0x0B
#define TEST_SAMPLE_Q                                 0x0C
#define DVDD                                          0x0D
#define TEST_CRYSTAL_VDD                              0x0E
#define AVDD                                          0x0F
#define FLOAT_IN                                      0x10

#define TX1_TX2_CW_DISABLE                            0
#define TX1_CW_ENABLE                                 1
#define TX2_CW_ENABLE                                 2
#define TX1_TX2_CW_ENABLE                             3

// 发射参数设置
#define MODWIDTH_106                                  0x26 // 106Kbps为0x26
#define MODWIDTH_212                                  0x13 // 212kbps为0x13
#define MODWIDTH_424                                  0x09 // 424kbps为0x09
#define MODWIDTH_848                                  0x04 // 848kbps为0x04

// 接收参数配置
// TYPE A
#define RXGAIN_A                                      5  // 设置范围0~7
#define GSNON_A                                       15 // 设置范围0~15
#define GSP_A                                         63 // 设置范围0~63
#define COLLLEVEL_A                                   4  // 设置范围0~7
#define MINLEVEL_A                                    8  // 设置范围0~15
// TYPE B
#define RXGAIN_B                                      6  // 设置范围0~7
#define GSNON_B                                       15 // 设置范围0~15
#define MODGSNON_B                                    6  // 设置范围0~15
#define GSP_B                                         31 // 设置范围0~63
#define MODGSP_B                                      10 // 设置范围0~63
#define MINLEVEL_B                                    4  // 设置范围0~15

#define RXWAIT                                        4 // 设置范围0~63
#define UARTSEL                                       2 // 默认设置为2  设置范围 0~3 0:固定低电平 1:TIN包络信号 2:内部接收信号 3:TIN调制信号

/**
 * @brief RC522写寄存器函数
 *
 * @param ucReg   - 寄存器地址
 * @param ucValue - 寄存器值
 */
extern void RfidPcdWriteReg(uint8_t ucReg, uint8_t ucValue);

/**
 * @brief RC522读寄存器函数
 *
 * @param ucReg    - 将要读取的寄存器地址
 * @return uint8_t - 寄存器的值
 */
extern uint8_t RfidPcdReadReg(uint8_t ucReg);

/**
 * @brief RC522置位寄存器相应位
 *
 * @param ucReg  - 将要置位的寄存器地址
 * @param ucMask - 置位位为1
 */
extern void RfidPcdSetBitMask(uint8_t ucReg, uint8_t ucMask);

/**
 * @brief RC522清零寄存器相应位
 *
 * @param ucReg  - 要置位的寄存器地址
 * @param ucMask - 清零位为1
 */
extern void RfidPcdClearBitMask(uint8_t ucReg, uint8_t ucMask);

/**
 * @brief 写寄存器
 *
 * @param ucReg - 目标寄存器地址
 * @param Mask  - :要改变的位
 * @param Set   - 置位（0:标志的位清零 其它:标志的位置）
 */
extern void RfidPcdModifyReg(uint8_t ucReg, uint8_t Mask, bool Set);

/**
 * @brief 读出FIFO的数据
 *
 * @param length    - 读取数据长度
 * @param fifo_data - 数据存放指针
 */
extern void RfidPcdReadFifo(uint8_t length, uint8_t *fifo_data);

/**
 * @brief 写入FIFO
 *
 * @param length    - 写入的数据长度
 * @param fifo_data - 数据存放指针
 */
extern void RfidPcdWriteFifo(uint8_t length, uint8_t *fifo_data);

/**
 * @brief 清空FIFO
 *
 * @return 状态（true：成功 false：失败）
 */
extern bool RfidPcdClearFIFO(void);

/**
 * @brief 读取FIFO接收数据长度信息
 *
 * @param FIFOLen     - FIFO有效字节长度
 * @param LastBitsLen - 最后字节的有效位长度
 * @param pRecBitsLen - 所有数据的位长度
 * @return bool       - 操作状态（true：成功 false：失败）
 */
extern bool RfidGetFIFODataLenth(uint8_t *FIFOLen, uint8_t *LastBitsLen, uint32_t *pRecBitsLen);

/**
 * @brief 载波设置
 *
 * @param Mode - 模式切换
 */
extern void RfidSetCW(uint8_t Mode);

/**
 * @brief 读取扩展寄存器
 *
 * @param RegAddr  - 寄存器地址
 * @return uint8_t - 寄存器数值
 */
extern uint8_t RfidReadExtReg(uint8_t RegAddr);

/**
 * @brief 写入扩展寄存器
 *
 * @param RegAddr  - 寄存器地址
 * @param Regvalue - 寄存器数值
 */
extern void RfidWriteExtReg(uint8_t RegAddr, uint8_t Regvalue);

/**
 * @brief 设置射频输出
 *
 * @param mode - 射频输出模式
 * @return 设置状态（true：成功 false：失败）
 */
extern bool RfidPcdSetRf(uint8_t mode);

/**
 * @brief RC522天线驱动开启
 *
 */
extern void RfidPcdTxAntOn(void);

/**
 * @brief RC522天线驱动关闭
 *
 */
extern void RfidPcdTxAntOff(void);

/**
 * @brief 读写芯片与卡片通信函数
 *
 * @param Command  - 操作命令
 * @param pDataIn  - 写入的数据
 * @param SizeIn   - 写入数据有效长度
 * @param pDataOut - 读取的数据
 * @param pSizeOut - 读取数据有效长度
 * @return uint8_t - 操作码
 */
extern uint8_t RfidPcdCommunication(uint8_t Command, uint8_t *pDataIn, uint8_t SizeIn, uint8_t *pDataOut, uint16_t *pSizeOut);

/**
 * @brief CRC校验方法
 *
 * @param pDataIn  - 指向待校验数据地址的指针变量
 * @param SizeIn   - 数据有效长度
 * @param pDataOut - 校验和
 */
extern void RfidCalulateCRC(uint8_t *pDataIn, uint8_t SizeIn, uint8_t *pDataOut);

/**
 * @brief 设置接收延时
 *
 * @param delaytime 延时时间（单位为毫秒）
 */
extern void RfidPcdSetTimer(uint32_t delaytime);

/**
 * @brief 获取芯片版本号
 *
 * @return uint8_t - 版本号
 */
extern uint8_t RfidGetChipVersion(void);

/**
 * @brief 修改PCD的模式
 *
 * @param ucType - 识读模式
 */
extern void RfidPcdISOType(char ucType);

/**
 * @brief PCD配置
 *
 */
extern void RfidPcdConfig(void);

/**
 * @brief 软复位
 *
 * @return 通讯状态(ture-成功  false-失败)
 */
extern bool RfidSoftwareReset(void);

/**
 * @brief 进入软件掉电模式
 *
 * @param En - 掉电状态（true:掉电 false:上电）
 */
extern void RfidPowerdown(bool En);


#endif
#endif
